package com.example.demotype;

import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Type;
import java.util.List;

/**
 * @author: 迟家鑫
 * @date: 2021/1/16 18:04
 * @description:
 */
public class GenericArrayTypeTest<T> {

    private T[] t = null;
    private List<String>[] listArray = null;

    public static void main(String[] args) throws Exception{
        // 2.GenericArrayType 泛型数组类型，例如List<String>[], T[]等；
        Field listArray = GenericArrayTypeTest.class.getDeclaredField("listArray");
        Type genericType1 = listArray.getGenericType();
        System.out.println("Class Name: " + genericType1.getClass().getName());

        GenericArrayType genericArrayType = (GenericArrayType) genericType1;
        // getGenericComponentType 返回泛型数组的Type对象：
        // 即List<String>[]中的List<String>(ParameterizedTypeImpl) , T[]中的T（TypeVariableImpl）
        // List<String>的原始类型为泛型，所以type最终的类型为
        Type genericComponentType = genericArrayType.getGenericComponentType();
        System.out.println("Type Name: " + genericComponentType);
        System.out.println("Class Name: " + genericComponentType.getClass().getName());
        // 值得注意的是无论是几维数组 getGenericComponentType 都只会脱去最右边的[] 返回剩下的值
    }
}
